\section{1. SOLID 1: SRP, ISP og DIP}

\begin{center}
\line(1,0){500}
\end{center}

\begin{itemize}
\item Redegør for designprincipperne Single Responsibility Principle (SRP), Interface Segregation 
Principle (ISP) og Dependency Inversion Principle (DIP)
\item Redegør for, hvordan du mener anvendelsen af principperne fremmer godt SW design 
\item Vis et eksempel på anvendelsen af et eller flere af principperne i SW design. 
\item Redegør for konsekvenserne ved anvendelsen af principperne  – har det nogle ulemper? 
\end{itemize}
\begin{center}
\line(1,0){500}
\end{center}

\subsubsection{SRP, ISP og DIP}
\textbf{Single Responsibility Principle}
\begin{itemize}
    \item En klasse skal kun have én grund til at ændre sig
    \begin{itemize}
        \item Hvis en klasse har flere grunde til at ændre sig(flere ansvarsområder), kan ændringer i et af områderne ændre på de andre
    \end{itemize}    
    \item Giver anledning til bloat i klasser hvis det ikke overholdes
    \begin{itemize}
        \item Svært at teste og vedligeholde
    \end{itemize}
\end{itemize}

\begin{lstlisting}
class Rectangle {
void Draw(); //Responsible for drawing
double CalculateArea(); //Responsible for calucalating area	
...}
\end{lstlisting}

\textbf{Interface Segregation Principle}
\begin{itemize}
    \item "Klienter skal ikke være tvunget til at være afhængig af metoder de ikke bruger"
    \item En klient kender kun til de dele af klassen der er nødvendige
\end{itemize}

\textbf{Dependency Inversion Principle}
\begin{itemize}
    \item Et høj-niveau modul skal ikke være afhængig af et lav-niveau modul, og omvendt, men abstraktioner
\begin{itemize}
        \item Et høj-niveau modul kender ikke til detajler i lav-niveau (HW, kommunikation etc)
        \item Lav-niveau kender ikke til det højere niveau (business logic, policies etc)
    \end{itemize}
    \item Abstraktioner skal ikke være afhængig af detajler, men detaljer skal være afhængig af abstraktioner
	\item Abstraktioner(interfaces) mellem lag
\end{itemize}
\subsubsection{Godt SW Design}
\begin{itemize}
    \item Programmer bliver mere fleksible og modulære
    \item Lettere at udvide og opdatere
    \item Klar afgrænsning mellem høj- og lav-niveau
    \item Tidsbesparende i det lange løb
    \item Koden bliver lettere at læse
    \item Unit-testing bliver nemmere
    \item Lav coupling og høj coherence 
\end{itemize}
\subsubsection{Eksempel}
\begin{center}
\includegraphics[scale=0.25]{1-eksempel}
\end{center}
\begin{itemize}
    \item Del Rectangle op i to, Rectangle / RectangleDrawer
    \item Indsæt interface "Shape" mellem Renderer og Rectangle
    \item Renderer skal benytte abstraction (OpenGL) i stedet for direkte kald til driver
\end{itemize}

\subsubsection{Konsekvenser - Ulemper}
\begin{itemize}
    \item Det er muligt at der bliver introduceret overhead i form af for mange lag
    \item Skal være i baghovedet og ikke bruges som bibel
\end{itemize}